 #ifndef _EXTERNAL_USEFULL_STRUCTS_H
#define _EXTERNAL_USEFULL_STRUCTS_H

#include <map>
#include <string>
#include <vector>

using std::string;
using std::vector;

//////////////////////////////////////////////////////////////////////////////////
//             To convert attributes values (integer <-> string)                //
//////////////////////////////////////////////////////////////////////////////////

class CIntegerStringMapper
{
protected:
	typedef std::map<int,string> MAP_INT_STR;
	typedef std::map<string,int> MAP_STR_INT;
	
	MAP_INT_STR m_mIntStr;
	MAP_STR_INT m_mStrInt;

	void SetValue( int nValue1, string sValue2 )
	{
		m_mIntStr[nValue1] = sValue2;
	}

	void SetBackMap()
	{
		for( MAP_INT_STR::iterator iV = m_mIntStr.begin(); iV != m_mIntStr.end(); ++ iV ) 
			m_mStrInt.insert( std::make_pair(iV->second, iV->first) );
	}

public:
	CIntegerStringMapper() {}

  int GetCode( std::string sStr )
  {
		if( !m_mStrInt.size() ) 
			SetBackMap();		
		MAP_STR_INT::iterator iV = m_mStrInt.find( sStr );
		if( iV != m_mStrInt.end() )
			return iV->second;
    return -1;
  }

  const char* GetString( int cCode )
  {
		MAP_INT_STR::iterator iV = m_mIntStr.find( cCode );
		if( iV != m_mIntStr.end() )
			return iV->second.c_str();
    return "";
  }


};



//////////////////////////////////////////////////////////////////////////////////
//             To convert attributes values (integer <-> string)                //
//////////////////////////////////////////////////////////////////////////////////
 

class CStrongIntegerStringMapper
{
protected:
  typedef std::map<std::string,unsigned char> MAP_STRING_INT;
	
	MAP_STRING_INT m_mString;  
	const char** m_ppszStringValues;
	int m_nCount;
	  
public:

  CStrongIntegerStringMapper( const char** ppszStringValues, int nCount )
	{
    for( int i = 0; i < nCount; i ++ )
      m_mString.insert( MAP_STRING_INT::value_type( ppszStringValues[i], i ) );
		m_ppszStringValues = ppszStringValues;
		m_nCount = nCount;
	}
	
  char GetCode( std::string sStr )
  {
    MAP_STRING_INT::iterator mI;
    if( (mI = m_mString.find( sStr )) != m_mString.end() )
      return mI->second;
    return -1;
  }

  const char* GetString( unsigned char cCode )
  {
    if( cCode < m_nCount )
      return m_ppszStringValues[cCode];
    return m_ppszStringValues[0];
  }

};




#endif // _EXTERNAL_USEFULL_STRUCTS_H